﻿2026-05-10T12:09:04.3950669Z ##[group]Run pnpm verify:phase-4
2026-05-10T12:09:04.3950987Z [36;1mpnpm verify:phase-4[0m
2026-05-10T12:09:04.3973241Z shell: /usr/bin/bash -e {0}
2026-05-10T12:09:04.3973486Z env:
2026-05-10T12:09:04.3973915Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-10T12:09:04.3974238Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-10T12:09:04.3974467Z   SKIP_TRACE_CHECK: 1
2026-05-10T12:09:04.3974668Z ##[endgroup]
2026-05-10T12:09:04.6841343Z 
2026-05-10T12:09:04.6842468Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-10T12:09:04.6843486Z > node scripts/verify-phase-4.mjs
2026-05-10T12:09:04.6843954Z 
2026-05-10T12:09:04.7146118Z 
2026-05-10T12:09:04.7146858Z === Workspace: typecheck ===
2026-05-10T12:09:04.7147621Z >>> pnpm -r typecheck
2026-05-10T12:09:05.0752322Z Scope: 5 of 6 workspace projects
2026-05-10T12:09:05.0808252Z packages/db typecheck$ tsc --noEmit
2026-05-10T12:09:05.0815643Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T12:09:07.5683497Z packages/game-logic typecheck: Done
2026-05-10T12:09:07.5716754Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T12:09:09.8560658Z packages/db typecheck: Done
2026-05-10T12:09:11.1325759Z packages/protocol typecheck: Done
2026-05-10T12:09:11.1332598Z apps/client typecheck$ tsc --noEmit
2026-05-10T12:09:11.1336013Z apps/server typecheck$ tsc --noEmit
2026-05-10T12:09:21.6293288Z apps/client typecheck: Done
2026-05-10T12:09:22.9100718Z apps/server typecheck: Done
2026-05-10T12:09:22.9193005Z 
2026-05-10T12:09:22.9193586Z === Lint: protocol-sync ===
2026-05-10T12:09:22.9194529Z >>> pnpm lint:protocol-sync
2026-05-10T12:09:23.2216382Z 
2026-05-10T12:09:23.2217421Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-10T12:09:23.2218759Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-10T12:09:23.2219476Z 
2026-05-10T12:09:23.2527791Z lint-protocol-sync: OK
2026-05-10T12:09:23.2648071Z 
2026-05-10T12:09:23.2648606Z === Lint: game-logic-purity ===
2026-05-10T12:09:23.2649589Z >>> pnpm lint:game-logic-purity
2026-05-10T12:09:23.5693695Z 
2026-05-10T12:09:23.5719618Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-10T12:09:23.5742604Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-10T12:09:23.5743130Z 
2026-05-10T12:09:23.6094856Z lint-game-logic-purity: OK (6 file(s) clean)
2026-05-10T12:09:23.6212713Z 
2026-05-10T12:09:23.6213256Z === Lint: better-auth-schema-sync ===
2026-05-10T12:09:23.6214135Z >>> pnpm lint:better-auth-schema-sync
2026-05-10T12:09:23.9183827Z 
2026-05-10T12:09:23.9185006Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-10T12:09:23.9186547Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-10T12:09:23.9187253Z 
2026-05-10T12:09:25.5509184Z lint-better-auth-schema-sync: OK
2026-05-10T12:09:25.5632770Z 
2026-05-10T12:09:25.5633432Z === Lint: rate-limit-budgets ===
2026-05-10T12:09:25.5634214Z >>> pnpm lint:rate-limit-budgets
2026-05-10T12:09:25.8643629Z 
2026-05-10T12:09:25.8665559Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-10T12:09:25.8678466Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-10T12:09:25.8683903Z 
2026-05-10T12:09:25.8947743Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-10T12:09:25.9063674Z 
2026-05-10T12:09:25.9064471Z === Lint: no-clipboard-rce ===
2026-05-10T12:09:25.9066082Z >>> pnpm lint:no-clipboard-rce
2026-05-10T12:09:26.2106046Z 
2026-05-10T12:09:26.2118697Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-10T12:09:26.2129454Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-10T12:09:26.2130257Z 
2026-05-10T12:09:26.2428402Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-10T12:09:26.2547650Z 
2026-05-10T12:09:26.2548210Z === Lint: room-layout ===
2026-05-10T12:09:26.2549448Z >>> pnpm lint:room-layout
2026-05-10T12:09:26.5564148Z 
2026-05-10T12:09:26.5565332Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-10T12:09:26.5566835Z > node tools/scripts/lint-room-layout.mjs
2026-05-10T12:09:26.5568084Z 
2026-05-10T12:09:26.5907239Z lint-room-layout: OK
2026-05-10T12:09:26.6019143Z 
2026-05-10T12:09:26.6019806Z === ADR 0004 lint ===
2026-05-10T12:09:26.6020885Z >>> pnpm lint:adr:0004
2026-05-10T12:09:26.9039363Z 
2026-05-10T12:09:26.9043097Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-10T12:09:26.9044555Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-10T12:09:26.9047145Z 
2026-05-10T12:09:26.9324818Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T12:09:26.9435177Z 
2026-05-10T12:09:26.9442811Z === Drizzle: emit-check ===
2026-05-10T12:09:26.9443642Z >>> pnpm db:emit-check
2026-05-10T12:09:27.2438613Z 
2026-05-10T12:09:27.2439220Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-10T12:09:27.2441253Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-10T12:09:27.2442887Z 
2026-05-10T12:09:27.6908817Z No config path provided, using default 'drizzle.config.ts'
2026-05-10T12:09:27.6910417Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-10T12:09:28.1189508Z 8 tables
2026-05-10T12:09:28.1190347Z accounts 8 columns 1 indexes 0 fks
2026-05-10T12:09:28.1191405Z audit_log 6 columns 0 indexes 2 fks
2026-05-10T12:09:28.1192594Z characters 9 columns 0 indexes 1 fks
2026-05-10T12:09:28.1193503Z inventory_items 4 columns 0 indexes 1 fks
2026-05-10T12:09:28.1194476Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-10T12:09:28.1195476Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-10T12:09:28.1196431Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-10T12:09:28.1197290Z sessions 5 columns 0 indexes 1 fks
2026-05-10T12:09:28.1197831Z 
2026-05-10T12:09:28.1198655Z No schema changes, nothing to migrate 😴
2026-05-10T12:09:28.7052923Z 
2026-05-10T12:09:28.7053770Z === Drizzle: schema-sync ===
2026-05-10T12:09:28.7054504Z >>> pnpm lint:schema-sync
2026-05-10T12:09:29.0253022Z 
2026-05-10T12:09:29.0263767Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-10T12:09:29.0271186Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-10T12:09:29.0274708Z 
2026-05-10T12:09:29.0510198Z OK
2026-05-10T12:09:29.0632920Z 
2026-05-10T12:09:29.0641662Z === Drizzle: source-comments ===
2026-05-10T12:09:29.0645686Z >>> pnpm lint:source-comments
2026-05-10T12:09:29.3634530Z 
2026-05-10T12:09:29.3635649Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-10T12:09:29.3637092Z > pnpm -C packages/db run lint:source-comments
2026-05-10T12:09:29.3637780Z 
2026-05-10T12:09:29.6862953Z 
2026-05-10T12:09:29.6864181Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-10T12:09:29.6865481Z > node scripts/check-source-comments.mjs
2026-05-10T12:09:29.6866125Z 
2026-05-10T12:09:29.7187541Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-10T12:09:29.7402756Z 
2026-05-10T12:09:29.7403289Z === Workspace: test ===
2026-05-10T12:09:29.7403898Z >>> pnpm -r test
2026-05-10T12:09:30.0429699Z Scope: 5 of 6 workspace projects
2026-05-10T12:09:30.0485305Z packages/db test$ vitest run
2026-05-10T12:09:30.0494156Z packages/game-logic test$ vitest run
2026-05-10T12:09:30.5578771Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T12:09:30.5660058Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T12:09:30.9234798Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-10T12:09:31.1477247Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-10T12:09:31.3894405Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:09:31.6032539Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:09:31.6113726Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:09:31.6276857Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:09:31.6299223Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T12:09:31.6313058Z packages/game-logic test: [2m   Start at [22m 12:09:30
2026-05-10T12:09:31.6323916Z packages/game-logic test: [2m   Duration [22m 1.05s[2m (transform 123ms, setup 0ms, import 216ms, tests 49ms, environment 1ms)[22m
2026-05-10T12:09:31.6667971Z packages/game-logic test: Done
2026-05-10T12:09:31.6682999Z packages/protocol test$ vitest run
2026-05-10T12:09:31.8384335Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:09:32.1754471Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T12:09:32.6064331Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-10T12:09:32.6644216Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:09:32.6693414Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T12:09:32.6707381Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T12:09:32.6723425Z packages/db test: [2m   Start at [22m 12:09:30
2026-05-10T12:09:32.6740361Z packages/db test: [2m   Duration [22m 2.11s[2m (transform 180ms, setup 0ms, import 1.46s, tests 34ms, environment 1ms)[22m
2026-05-10T12:09:32.7028452Z packages/db test: Done
2026-05-10T12:09:32.8075384Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:09:32.9717805Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:09:33.1208467Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:09:33.1477128Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:09:33.1479261Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T12:09:33.1480735Z packages/protocol test: [2m   Start at [22m 12:09:32
2026-05-10T12:09:33.1482806Z packages/protocol test: [2m   Duration [22m 958ms[2m (transform 143ms, setup 0ms, import 281ms, tests 40ms, environment 0ms)[22m
2026-05-10T12:09:33.1633095Z packages/protocol test: Done
2026-05-10T12:09:33.1643120Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T12:09:33.1644418Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T12:09:33.6901805Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T12:09:33.8044080Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T12:09:34.8259798Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 58[2mms[22m[39m
2026-05-10T12:09:35.1876236Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T12:09:35.3652370Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T12:09:35.3673541Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T12:09:35.3788720Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 139[2mms[22m[39m
2026-05-10T12:09:35.4875545Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 25[2mms[22m[39m
2026-05-10T12:09:35.8469373Z apps/server test: {"level":40,"time":1778414975843,"pid":3270,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:09:35.8511429Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-10T12:09:35.8618542Z apps/server test: {"level":40,"time":1778414975847,"pid":3270,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:09:35.8633963Z apps/server test: {"level":40,"time":1778414975848,"pid":3270,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:09:36.5146424Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-10T12:09:36.8244446Z apps/server test: {"level":30,"time":1778414976780,"pid":3294,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T12:09:36.8664344Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 697[2mms[22m[39m
2026-05-10T12:09:36.8723905Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 557[2mms[22m[39m
2026-05-10T12:09:37.7654198Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T12:09:37.7657073Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-OXkASK/rebno.db
2026-05-10T12:09:37.7658946Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:09:37.7660433Z apps/server test: [run-migrations] OK
2026-05-10T12:09:37.7785337Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T12:09:37.7790735Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-1aAlpL/rebno.db
2026-05-10T12:09:37.7792996Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:09:37.7795152Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T12:09:37.7797244Z apps/server test: [run-migrations] OK
2026-05-10T12:09:37.7914126Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:09:37.7924808Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-Y3cTaa/rebno.db
2026-05-10T12:09:37.7943248Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:09:37.7954806Z apps/server test: [run-migrations] OK
2026-05-10T12:09:37.7957029Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:09:37.7959979Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-Y3cTaa/rebno.db
2026-05-10T12:09:37.7961922Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:09:37.7964330Z apps/server test: [run-migrations] OK
2026-05-10T12:09:37.8017465Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 56[2mms[22m[39m
2026-05-10T12:09:37.8033896Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-10T12:09:38.0860079Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 26[2mms[22m[39m
2026-05-10T12:09:38.3624426Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:09:38.6744413Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T12:09:38.9044967Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:09:39.0022965Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 115[2mms[22m[39m
2026-05-10T12:09:39.7236315Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T12:09:39.7253805Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ multiple files { path: ['.env.local', '.env'] }
2026-05-10T12:09:39.7273024Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T12:09:40.2873406Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 182[2mms[22m[39m
2026-05-10T12:09:40.5332920Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:09:40.5461543Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T12:09:40.5483398Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T12:09:40.5494075Z apps/server test: [2m   Start at [22m 12:09:33
2026-05-10T12:09:40.5552872Z apps/server test: [2m   Duration [22m 6.84s[2m (transform 475ms, setup 0ms, import 3.46s, tests 932ms, environment 2ms)[22m
2026-05-10T12:09:40.5992966Z apps/server test: Done
2026-05-10T12:09:41.0636154Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T12:09:41.8018215Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 78[2mms[22m[39m
2026-05-10T12:09:42.4917498Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:09:43.1717283Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:09:43.8327051Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T12:09:44.5114528Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 25[2mms[22m[39m
2026-05-10T12:09:45.1909725Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:09:45.8617611Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T12:09:46.5435458Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:09:47.2307901Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:09:47.8959083Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:09:47.9187418Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T12:09:47.9208257Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T12:09:47.9209674Z apps/client test: [2m   Start at [22m 12:09:33
2026-05-10T12:09:47.9213356Z apps/client test: [2m   Duration [22m 14.11s[2m (transform 531ms, setup 43ms, collect 834ms, tests 635ms, environment 8.10s, prepare 1.72s)[22m
2026-05-10T12:09:48.0518826Z apps/client test: Done
2026-05-10T12:09:48.0604227Z 
2026-05-10T12:09:48.0605082Z verify-phase-4: OK (12 steps green)
